package org.example.erat.log.observer;

import org.example.erat.log.core.LogObserver;
import org.example.erat.log.core.LoggerSingleton;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 控制台日志观察者
 * 将重要日志输出到控制台
 */
@Component
public class ConsoleLogObserver implements LogObserver {
    
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    // ANSI颜色代码
    private static final String ANSI_RESET = "\u001B[0m";
    private static final String ANSI_RED = "\u001B[31m";
    private static final String ANSI_GREEN = "\u001B[32m";
    private static final String ANSI_YELLOW = "\u001B[33m";
    private static final String ANSI_BLUE = "\u001B[34m";
    
    /**
     * 构造函数
     */
    public ConsoleLogObserver() {
        // 注册到日志单例
        LoggerSingleton.getInstance().addObserver(this);
        System.out.println(ANSI_GREEN + "控制台日志观察者初始化完成" + ANSI_RESET);
    }
    
    @Override
    public void update(String level, String message) {
        // 只输出重要日志
        if (isImportantLog(level, message)) {
            String timestamp = dateFormat.format(new Date());
            String coloredLevel = getColoredLevel(level);
            System.out.println(String.format("[%s] %s %s", timestamp, coloredLevel, message));
        }
    }
    
    /**
     * 判断是否是重要日志
     * @param level 日志级别
     * @param message 日志消息
     * @return 是否是重要日志
     */
    private boolean isImportantLog(String level, String message) {
        // 错误日志都是重要的
        if ("ERROR".equals(level)) {
            return true;
        }
        
        // 警告日志中关于文件名不合规和学生不在名单中的是重要的
        if ("WARN".equals(level) && (message.contains("文件名不合规") || message.contains("学生不在名单中"))) {
            return true;
        }
        
        // 信息日志中包含"成功"、"完成"、"导入"、"分析"的是重要的
        if ("INFO".equals(level) && (message.contains("成功") || message.contains("完成") || 
                message.contains("导入") || message.contains("分析") || message.startsWith("【"))) {
            return true;
        }
        
        return false;
    }
    
    /**
     * 获取带颜色的日志级别
     * @param level 日志级别
     * @return 带颜色的日志级别
     */
    private String getColoredLevel(String level) {
        switch (level) {
            case "ERROR":
                return ANSI_RED + "[ERROR]" + ANSI_RESET;
            case "WARN":
                return ANSI_YELLOW + "[WARN]" + ANSI_RESET;
            case "INFO":
                return ANSI_GREEN + "[INFO]" + ANSI_RESET;
            case "DEBUG":
                return ANSI_BLUE + "[DEBUG]" + ANSI_RESET;
            default:
                return "[" + level + "]";
        }
    }
}
